 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Studio7i.Dominio;
using Studio7i.Persistencia;

namespace Studio7i.Pruebas
{
    public class TestLocalDAO
    {

        [TestFixture]
        public class Test1_localDAO
        {
            // Atributos a utilizar durante las pruebas
            private LocalDAO localDAO = null;
            private int codigoGenerado = 0;

            [TestFixtureSetUp]
            public void PrepararPruebas()
            {
                // 1. Definimos la implementación del DAO a probar
                localDAO = new Persistencia.LocalDAO();

                // 2. Eliminamos todos los cientes en BD antes de las pruebas
                foreach (Local Local in localDAO.ListarTodos())
                localDAO.Eliminar(Local);

                // 3. Creamos datos para tenerlos disponibles en las pruebas
                localDAO.Crear(new Local() { CodLocal = 1, Nombre = "Local A", Direccion = "Av Aviacion 2800", Distrito = "San Borja" });
                localDAO.Crear(new Local() { CodLocal = 2, Nombre = "Local B", Direccion = "Av La Marina 1212", Distrito = "San Miguel" });
                localDAO.Crear(new Local() { CodLocal = 3, Nombre = "Local C", Direccion = "Av San Luis 1123", Distrito = "San Luis" });
                localDAO.Crear(new Local() { CodLocal = 4, Nombre = "Local D", Direccion = "Av Javier Prado 2332", Distrito = "San Isidro" });
                localDAO.Crear(new Local() { CodLocal = 5, Nombre = "Local E", Direccion = "Av Tomás Marzano 4220", Distrito = "San tiago de Surco" });
                
            }

            [Test]
            public void Test1_Crear()
            {
                // 1. Clase a probar: LocalDAO
                Assert.IsNotNull(localDAO);

                // 2. Declaramos e instanciamos la entidad de dominio
                Local localACrear = new Local();
                localACrear.Nombre = "Local 6";
                localACrear.Direccion = "Av Aviacion 345";
                localACrear.Distrito = "SAN BORJA";

                // 3. Declaramos la entidad que contendrá el resultado
                Local localCreado = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                // 5. Ejecutamos el método a probar
                    localCreado = localDAO.Crear(localACrear);
                    codigoGenerado = localCreado.CodLocal;
                }, "local creado");
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(localCreado);
                // Probamos que el código generado sea mayor a 0
                Assert.Greater(localCreado.CodLocal, 0);
                // Probamos que el distrito registrado es igual al solicitado con la entidad
                Assert.AreEqual(localCreado.Distrito, localACrear.Distrito);
                // Probamos que la dirección registrada es igual a la solicitada con la entidad
                Assert.AreEqual(localCreado.Direccion, localACrear.Direccion);
            }
            [Test]
            public void Test2_Obtener()
            {
                // 1. Clase a probar: LocalDAO
                Assert.IsNotNull(localDAO);
                // 2. Definimos los datos para la prueba
                int codigo = 2;
                // 3. Declaramos la entidad que contendrá el resultado
                Local localObtenido = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    localObtenido = localDAO.Obtener(codigo);
                });
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(localObtenido);
                Assert.AreEqual(localObtenido.CodLocal, codigo);
                Assert.IsNotNullOrEmpty(localObtenido.Direccion);
                Assert.IsNotNullOrEmpty(localObtenido.Distrito);
            }
            [Test]
            public void Test3_Modificar()
            {
                Local localInterno = new Local();
                localInterno.CodLocal = 2;
                localInterno.Nombre  = "Local 2";
                localInterno.Direccion = "Villa Marina 321";
                localInterno.Distrito = "Chorrillos";
                // 1. Clase a probar: LocalDAO
                Assert.IsNotNull(localDAO);
                // 2. Declaramos e instanciamos la entidad de dominio
                Local localAModificar = localInterno;
                localInterno.Nombre = "Local B";
                localAModificar.Direccion = "Baileti 654";
                localAModificar.Distrito = "SAN BORJA";
                // 3. Declaramos la entidad que contendrá el resultado
                Local localModificado = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    localModificado = localDAO.Modificar(localAModificar);
                }, "Local modificado");
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(localModificado);
                // Probamos que el código generado sea mayor a 0
                Assert.AreEqual(localModificado.CodLocal, localInterno.CodLocal);
                // Probamos que el nombre registrado es igual al solicitado con la entidad
                Assert.AreEqual(localModificado.Distrito, localAModificar.Distrito);
                // Probamos que la dirección registrada es igual a la solicitada con la entidad
                Assert.AreEqual(localModificado.Direccion, localAModificar.Direccion);
            }

            [Test]
            public void Test4_Eliminar()
            {
                // 1. Clase a probar: localDAO
                Assert.IsNotNull(localDAO);

                // 2. Declaramos e instanciamos la entidad de dominio a eliminar
                codigoGenerado = 5;
                Local localAEliminar = localDAO.Obtener(codigoGenerado);

                // 3. Declaramos la entidad que contendrá el resultado
                Local localEliminado = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    localDAO.Eliminar(localAEliminar);
                }, "Local eliminado");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNull(localEliminado);

            }
        }
    }
}

